package fr.esiag.projet17.operation.utilisateur.connect;

import java.io.ByteArrayInputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

import fr.esiag.projet17.action.UtilisateurAction;
import fr.esiag.projet17.client.transfert.UtilisateurElement;
import fr.esiag.projet17.controller.DefaultController;
import fr.esiag.projet17.operation.IOperation;
import fr.esiag.projet17.services.transfert.TransfertUtilisateur;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(namespace = "http://metier.projet17.fr/operation", name = "ConnectUtilisateurOperationType", propOrder = {
		"credentials", "utilisateur" })
@XmlRootElement(namespace = "http://metier.projet17.fr/operation")
public class ConnectUtilisateurOperation implements
		IOperation<ConnectUtilisateur> {

	@XmlElement(namespace = "http://metier.projet17.fr/operation", required = true)
	private ConnectUtilisateurRequest credentials;

	@XmlElement(namespace = "http://metier.projet17.fr/operation")
	private ConnectUtilisateur utilisateur;

	ConnectUtilisateur connect(ConnectUtilisateurRequest credentials) {
		ConnectUtilisateur lConnectedUser = new ConnectUtilisateur();
		UtilisateurAction action = new UtilisateurAction(
				DefaultController.getProps());
		action.setLogin(credentials.getLogin());
		action.setPassword(credentials.getPassword());
		byte[] user = action.run();
		try {
			JAXBContext context = JAXBContext
					.newInstance(UtilisateurElement.class);
			Unmarshaller unmarshaller = context.createUnmarshaller();
			ByteArrayInputStream bais = new ByteArrayInputStream(user);
			UtilisateurElement element = (UtilisateurElement) unmarshaller
					.unmarshal(bais);
			TransfertUtilisateur transfert = new TransfertUtilisateur();
			transfert.setId(element.getId());
			transfert.setNom(element.getNom());
			transfert.setPrenom(element.getPrenom());
			transfert.setLogin(element.getLogin());
			transfert.setPassword(element.getMotdepasse());
			lConnectedUser.setUtilisateur(transfert);
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return lConnectedUser;
	}

	public ConnectUtilisateurRequest getCredentials() {
		return credentials;
	}

	public void setCredentials(ConnectUtilisateurRequest credentials) {
		this.credentials = credentials;
	}

	public ConnectUtilisateur getUtilisateur() {
		return utilisateur;
	}

	public void setUtilisateur(ConnectUtilisateur utilisateur) {
		this.utilisateur = utilisateur;
	}

	@Override
	public ConnectUtilisateur call() {
		return this.connect(credentials);
	}

}
